AWS Chatbotで複数リージョンのAWS Health Dashboardの内容をSlackに通知する

AWS Chatbotで複数リージョンのAWS Health Dashboardの内容をSlackに通知する

AWS Chatbotは便利ですね。
Clock Icon2022.08.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS Chatbotを使ってAWS Health Dashboardの内容をSlackに通知してみました。 何かあったときに見に行くよりは、自動で教えてくれる(Slackに通知がくる)ので便利です。

画面ポチポチでも簡単に実現できますが、複数のAWSアカウントや複数のリージョンで実施することを想定して、CloudFormationで作成します。

本記事では、複数リージョンのAWS Health Dashboardの内容をひとつのSlackチャンネルに通知します。

おすすめの方

  • AWS Health Dashboardの内容をAWS ChatbotでSlackに通知したい方
  • Amazon EventBridgeの内容をAWS ChatbotでSlackに通知したい方

重要

EventBridgeのルールは、リージョン毎に作成する必要があります。 グローバルサービスの場合は、バージニア北部です。

本記事では、東京とバージニア北部の2つのリージョンを扱います。

AWS Chatbotを準備する

Slackワークスペースの認証とワークスペースID取得

WebコンソールでAWS Chatbotにアクセスし、ワークスペースを追加します。下記のワークスペースIDはあとで必要なのでメモしておきます。

SlackワークスペースのIDを確認する

SlackチャンネルIDを取得

任意のチャンネルのリンクを取得します。

SlackチャンネルIDを確認する

このリンクの最後の文字列を使います。下記例だとABCD1234がチャンネルIDです。

https://classmethod.slack.com/archives/ABCD1234

EventBridgeとSNSトピックを各リージョンにデプロイする

まずは、EventBridgeとSNSトピックを各リージョンにデプロイします。 今回は、CloudFormation StackSetsを利用して、2つのリージョンにデプロイします。

もしもリージョン毎に通知条件を変えたい場合は、CloudFormation StackSetsを使わずに個別デプロイしてください。 (リージョンAは全てのサービス、リージョンBはSESのみ、など)

CloudFormation StackSetsの事前準備

次を参考にして、2つのIAMロールを作成します。

CloudFormationテンプレート

今回は、AWS Health Dashboardのすべてのイベントを通知します。 一部のイベントのみを通知したい場合は、EventBridgeでフィルタリングしてください。

AWSTemplateFormatVersion: "2010-09-09"
Description: SNS Topic and EventBridge for Health Dashboard

Parameters:
  Env:
    Type: String
    Default: dev

Resources:
  HealthDashboardForChatbotTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: !Sub notify-slack-health-dashbord-topic-${Env}

  HealthDashboardForChatbotTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      PolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service: events.amazonaws.com
            Action: sns:Publish
            Resource: '*'
      Topics:
        - !Ref HealthDashboardForChatbotTopic

  SubscribeHealthDashboardEventRule:
    Type: AWS::Events::Rule
    Properties:
      EventPattern:
        source:
          - aws.health
      Targets:
        - Id: HealthDashboardForChatbotTopic
          Arn: !Ref HealthDashboardForChatbotTopic

CloudFormation StackSetsでデプロイする

流れるままに進んでいきます。

CloudFormation StackSets

StackSets名は「notify-slack-health-dashbord-topic」としました。

CloudFormation StackSets名を入力する

リージョンは、東京とバージニア北部を選択します。

CloudFormation StackSetsの対象リージョンを決める

なお、最近追加されたリージョンは、デフォルトで無効状態です。そのため、「すべてのリージョン」を選択した場合は、必要に応じて除外してください。 無効化されたリージョンに対してCloudFormation StackSetsを実行すると、「無効なリージョンのため実行できません」的なエラーが出ます。

  • 中東 (バーレーン)
  • アフリカ (ケープタウン)
  • アジアパシフィック (香港)
  • 欧州 (ミラノ)

新しいリージョンは、デフォルトで無効になっている

準備ができたので、実行します。ステータスが SUCCEEDED になるまで待ちます。

CloudFormation StackSetsでデプロイ待ち

CloudFormation StackSetsでデプロイが終わった

EventBridgeとSNSトピックのデプロイが終わりました。

AWS Chatbotのチャンネル設定をデプロイする

続いて、各リージョンのSNSトピックを受け取ってSlackに通知する部分をデプロイしていきます。

CloudFormationテンプレートファイル

SNSトピックは各リージョンにあるため、ARNを直接記載しています。

また、次のパラメータをデプロイ時に渡しています。必要に応じてパラメータストアを使うなどしてください。

  • Env
  • SlackWorkspaceId
  • SlackHealthDashboardChannelId
AWSTemplateFormatVersion: "2010-09-09"
Description: AWS Chatbot and Health Dashboard

Parameters:
  Env:
    Type: String
    Default: dev

  SlackWorkspaceId:
    Type: String

  SlackHealthDashboardChannelId:
    Type: String

Resources:
  NotifySlackChatbot:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties:
      ConfigurationName: !Sub notify-slack-health-dashbord-${Env}
      IamRoleArn: !GetAtt NotifySlackChatbotIamRole.Arn
      LoggingLevel: INFO
      SlackWorkspaceId: !Ref SlackWorkspaceId
      SlackChannelId: !Ref SlackHealthDashboardChannelId
      SnsTopicArns:
        # リージョンの数だけ記載する
        - !Sub arn:aws:sns:ap-northeast-1:${AWS::AccountId}:notify-slack-health-dashbord-topic-${Env}
        - !Sub arn:aws:sns:us-east-1:${AWS::AccountId}:notify-slack-health-dashbord-topic-${Env}

  NotifySlackChatbotIamRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub notify-slack-health-dashbord-role-${Env}
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: chatbot.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess

デプロイ

ここでは、parameter-overridesでパラメータを渡しています。

aws cloudformation deploy \
    --template-file chatbot_health_dashboard.yaml \
    --stack-name notify-slack-health-dashbord-chatbot-stack \
    --capabilities CAPABILITY_NAMED_IAM \
    --parameter-overrides \
        Env=dev \
        SlackWorkspaceId=xxx \
        SlackHealthDashboardChannelId= ABCD1234 \
    --no-fail-on-empty-changeset

動作を確認する

サンプルイベントを取得する

マネジメントコンソールのEventBridgeを見ると、サンプルイベントが分かります。 このサンプルイベントをコピーします。

EventBridgeのサンプルイベント

SNSトピックでメッセージを送信する

東京リージョン

まずは、東京リージョンのSNSトピックで確認します。 作成したSNSトピックにメッセージを送信します。 メッセージは、さきほどコピーしたサンプルイベントです。 分かりやすいようにリージョン部分だけを東京に書き換えています。

東京リージョンのSNSトピックにメッセージを送信する

バージニア北部リージョン

続いて、バージニア北部リージョンのSNSトピックにアクセスして、同様にメッセージを送信します。 リージョン部分をバージニア北部に書き換えています。

バージニア北部リージョンのSNSトピックにメッセージを送信する

Slackに通知がきた!

バッチリです。

SlackにAWS Health Dashboardの通知がきた

さいごに

AWS Health Dashboardの内容をSlackに通知してみました。 何かあったときに見に行くよりは、自動で教えてくれる(Slackに通知がくる)ので便利です。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.